package com.broada.apm.logic;

import java.io.File;
import java.util.List;

import com.broada.apm.entity.ConfigVariable;
import com.broada.apm.entity.IPLocation;
import com.broada.apm.entity.NoticeCommandException;
import com.broada.apm.entity.ThresholdType;
import com.broada.apm.es.bean.ClusterInfo;
import com.broada.apm.indicator.api.common.ApmDataIndicatorException;
import com.broada.apm.indicator.api.common.IllegalIPAddressException;
import com.broada.apm.model.ConfigItem;
import com.broada.apm.model.Dimension.Area;
import com.broada.apm.model.Dimension.Error;
import com.broada.apm.model.L7Module;
import com.broada.apm.model.PagingList;
import com.broada.apm.model.User;

/**
 * 
 * 系统配置操作logic接口类
 * 
 * @author xiangsy Create By 2015年2月6日 上午10:17:56
 */
public interface ConfigLogic {
	/**
	 * 添加配置信息数据
	 * 
	 * @param json对象字符串
	 * @throws ApmDataIndicatorException 
	 * @throws NoticeCommandException 
	 */
	public void addConfigData(ConfigVariable variable) throws ApmDataIndicatorException, NoticeCommandException;

	/**
	 * 查询配置信息数据
	 * 
	 * @param 查询条件关键字前缀confItem
	 * @throws ApmDataIndicatorException
	 */
	public List<ConfigItem> queryConfigData(String confItem) throws ApmDataIndicatorException;

	/**
	 * IP地理位置库维护内置库立即更新
	 * 
	 * @param
	 * @return
	 */
	public void updateLib();

	/**
	 * 用户管理用户列表查询
	 * 
	 * @param
	 * @return
	 * @throws ApmDataIndicatorException
	 */
	public PagingList<User> queryUser(int pageIndex, int pageSize) throws ApmDataIndicatorException;

	/**
	 * 用户账号查询
	 * 
	 * @param
	 * @return
	 */
	public User queryUserByAccount(String account) throws ApmDataIndicatorException;

	/**
	 * 用户管理用户添加
	 * 
	 * @param 添加的对象数据
	 * @return
	 * @throws Exception 
	 */
	public void addUser(User user) throws Exception;

	/**
	 * 用户管理用户修改
	 * 
	 * @param x修改的对象数据
	 * @return
	 * @throws ApmDataIndicatorException 
	 */
	public void updateUser(User user) throws ApmDataIndicatorException;

	/**
	 * 用户管理用户删除
	 * 
	 * @param userId
	 *          要删除的用户id
	 * @return
	 * @throws ApmDataIndicatorException 
	 */
	public void delUser(String userId) throws ApmDataIndicatorException;

	/**
	 * 用户管理密码修改
	 * 
	 * @param userId
	 *          要修改密码的用户id
	 * @param pwd
	 *          要修改的密码
	 * @return
	 * @throws Exception 
	 */
	public void updatePwd(String userId, String oldPass, String newPass) throws Exception;

	/**
	 * 用户启用与禁用
	 * 
	 * @param userId
	 *          要修改密码的用户id
	 * @param status
	 *          要修改的状态
	 * @return
	 * @throws Exception 
	 */
	public void updateStatus(String userId, int status) throws Exception;

	/**
	 * L7模块列表查询
	 * 
	 * @param
	 * @return
	 */
	public List<L7Module> queryL7Module();

	/**
	 * L7模块删除
	 * 
	 * @param moduleId
	 *          模块id
	 * @return
	 */
	public void deleteL7Module(String moduleId) throws Exception;

	/**
	 * L7模块启用与禁用
	 * 
	 * @param moduleId
	 *          模块id 目前这里使用的id与l7_protoc一致
	 * @param status
	 *          要修改的状态
	 * @return
	 */
	public void updStatusL7Module(String moduleId, int status) throws Exception;

	/**
	 * L7模块返回码设置
	 * 
	 * @param moduleId
	 *          模块id
	 * @param status
	 *          要修改的状态
	 * @return
	 * @throws Exception 
	 */
	public void setL7ModuleCode(Error error) throws Exception;

	/**
	 * L7模块返回码添加
	 * 
	 * @param codeJson
	 *          返回码信息字符串
	 * @return
	 * @throws Exception 
	 */
	public void addL7ModuleCode(Error error) throws Exception;

	/**
	 * L7模块返回码添加
	 * 
	 * @param moduleId
	 *          模块id
	 * @return
	 * @throws Exception 
	 */
	public List<Error> queryL7ModuleCode(String moduleId) throws Exception;

	/**
	 * L7模块返回码添加删除
	 * 
	 * @param Error
	 *          错误码对象error
	 * @param codeId
	 *          返回码id
	 * @return
	 * @throws Exception 
	 */
	public void delL7ModuleCode(int protocol, String id, String code, String errorMessage) throws Exception;

	/**
	 * 根据code返回对应的下级市/区 如果参数为NULL则返回省份集合
	 * 
	 * @param code
	 * @return
	 */
	public List<Area> queryAreaByCode(String code);

	/**
	 * IP维护信息添加
	 * 
	 * @param json
	 * @return
	 * @throws IllegalIPAddressException 
	 * @throws ApmDataIndicatorException 
	 * @throws NoticeCommandException 
	 */
	public void saveIPLocation(IPLocation ipLocation) throws IllegalIPAddressException, ApmDataIndicatorException, NoticeCommandException;

	/**
	 * IP维护信息删除
	 * @throws NoticeCommandException 
	 * @throws ApmDataIndicatorException 
	 */
	public void deleteIPLocation(String id) throws ApmDataIndicatorException, NoticeCommandException;

	/**
	 * IP维护信息查询
	 * 
	 * @throws ApmDataIndicatorException
	 */
	public List<IPLocation> queryIPLocation(String ip, String areaCode, String memo, String pageIndex, String pageSize) throws ApmDataIndicatorException;
	
	/**
	 * IP维护信息查询
	 * 
	 * @throws ApmDataIndicatorException
	 */
	public int queryAllIPLocationSize() throws ApmDataIndicatorException;

	/**
	 * 历史数据磁盘容量和使用量查询
	 * 
	 * @param
	 * @return
	 * @throws ApmDataIndicatorException 
	 */
	public ClusterInfo historyDiskData() throws ApmDataIndicatorException;

	/**
	 * 历史数据清理
	 * 
	 * @param
	 * @return
	 */
	public boolean historyCleanData(int time,String appIds);

	/**
	 * 阀值类型列表
	 * 
	 * @return
	 */
	public List<ThresholdType> queryAlertThresholdType();

	/**
	 * 查询基准apdex
	 * 
	 * @return
	 */
	public float queryBaseApdex();

	/**
	 * 地理位置库批量导入
	 * 
	 * @return
	 */
	public int ipFileUpload(List<IPLocation> iplist);

	/**
	 * 本地解压ZIP 并解析,根据返回值进行相关业务处理
	 * 
	 * return 0:L7模块存在且运行中 return 1:L7模块存在未运行 return 2:L7模块不存在 直接保存，模块默认不启用
	 * 
	 * @param file
	 * @return
	 * @throws Exception
	 */
	public int resolveL7Module(File file) throws Exception;


}
